package com.wqm.step.dao.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.DetachedCriteria;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;

import com.wqm.step.common.utils.JsonUtils;
import com.wqm.step.dao.PersonDao;
import com.wqm.step.pojo.Person;

@Repository
public class PersonDaoImpl extends HibernateDaoSupport implements PersonDao {

	@Autowired
	public void setSuperSessionFactory(SessionFactory factory) {
		super.setSessionFactory(factory);
	}

	// HQL查询所有数据，list()方法，将所有对象，存入list中，最终返回list

	/*public List<Person> findAll() {
		System.out.println("dao");
		Session session = this.getSessionFactory().getCurrentSession();
		List<Person> list = (List<Person>) session.createQuery("from Person").list();
		return list;
	}*/

	// 使用Criteria查询对查询条件进行了面向对象封装，符合编程人员的思维方式,但HQL提供了更加丰富的和灵活方法
	
/*	public List<Person> findAll() {
		System.out.println("dao");
		DetachedCriteria criteria = DetachedCriteria.forClass(Person.class);
		List<Person> byCriteria = (List<Person>) this.getHibernateTemplate().findByCriteria(criteria);
		return byCriteria;
	}*/
	 

	// uniqueResult()方法，返回对象， 但一个对象，只能存一条数据，如果数据库有多条数据，这个就不行了
	public List<Person> findAll() {
		System.out.println("dao");
		Session s1 = this.getSessionFactory().openSession();
		Session s2 = this.getSessionFactory().openSession();
		System.out.println(s1 == s2); // false, 这里表示这不是同一个session
		Session session = this.getSessionFactory().getCurrentSession();
		Session session2 = this.getSessionFactory().getCurrentSession();
		// true, 所以获取session用getCurrentSession(),并在hibernate.xml的配置中也配置上
		// <!-- 使用同一线程中的session,在dao中使用getCurrentSession() 获取当前线程的session -->
		// <prop key="hibernate.current_session_class">thread</prop>
		System.out.println(session == session2);
		Person person = (Person) session.createQuery("from Person").uniqueResult();
		List<Person> list = new ArrayList<Person>();
		list.add(person);
		return list;
	}
}
